// Package dlinux
//
// 用于操作linux的函数集合
package dlinux

import (
	"fmt"
	"io"
	"os"
)

// func Copy： 拷贝文件
//
// src: 源文件
//
// dst： 目的文件
//
// BUFFERSIZE： 缓存大小
func Copy(src, dst string /*源和目标文件*/, BUFFERSIZE int64 /*缓存大小*/) error {
	sourceFileStat, err := os.Stat(src)
	if err != nil {
		return err
	}

	if !sourceFileStat.Mode().IsRegular() {
		return fmt.Errorf("%s is not a regular file.", src)
	}

	source, err := os.Open(src)
	if err != nil {
		return err
	}
	defer source.Close()

	_, err = os.Stat(dst)
	if err == nil {
		return fmt.Errorf("File %s already exists.", dst)
	}

	destination, err := os.Create(dst)
	if err != nil {
		return err
	}
	defer destination.Close()

	if err != nil {
		panic(any(err))
	}

	buf := make([]byte, BUFFERSIZE)
	for {
		n, err := source.Read(buf)
		if err != nil && err != io.EOF {
			return err
		}
		if n == 0 {
			break
		}

		if _, err := destination.Write(buf[:n]); err != nil {
			return err
		}
	}
	return err
}

/*
PathExists ：golang判断文件或文件夹是否存在的方法为使用os.Stat()函数返回的错误值进行判断:

返回值：

	true,nil: 如果返回的错误为nil,说明文件或文件夹存在
	false,nil：说明文件或文件夹不存在
	false,err： 如果返回的错误为其它类型,则不确定是否在存在
*/
func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}
